
/*
 * Copyright (C) Igor Sysoev
 */


#ifndef _NGX_PALLOC_H_INCLUDED_
#define _NGX_PALLOC_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_files.h>

/*
 * NGX_MAX_ALLOC_FROM_POOL should be (ngx_pagesize - 1), i.e. 4095 on x86.
 * On Windows NT it decreases a number of locked pages in a kernel.
 */
#define NGX_MAX_ALLOC_FROM_POOL  (ngx_pagesize - 1)

#define NGX_DEFAULT_POOL_SIZE    (16 * 1024)
#define NGX_MIN_POOL_SIZE                                                     \
    (sizeof(ngx_pool_t) + 2 * sizeof(ngx_pool_large_t))

typedef struct ngx_pool_s        ngx_pool_t;
struct ngx_chain_s;
struct ngx_log_s;

typedef void (*ngx_pool_cleanup_pt)(void *data);

typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;

struct ngx_pool_cleanup_s {
    ngx_pool_cleanup_pt   handler;
    void                 *data;
    ngx_pool_cleanup_t   *next;
};


typedef struct ngx_pool_large_s  ngx_pool_large_t;

struct ngx_pool_large_s {
    ngx_pool_large_t     *next;
    void                 *alloc;
};


typedef struct {
    u_char               *last;
    u_char               *end;
    struct ngx_pool_s           *next;
    ngx_uint_t            failed;
} ngx_pool_data_t;


struct ngx_pool_s {
    ngx_pool_data_t       d;
    size_t                max;
    struct ngx_pool_s           *current;
    struct ngx_chain_s          *chain;
    ngx_pool_large_t     *large;
    ngx_pool_cleanup_t   *cleanup;
    struct ngx_log_s            *log;
};


typedef struct {
    ngx_fd_t              fd;
    u_char               *name;
    struct ngx_log_s            *log;
} ngx_pool_cleanup_file_t;


void *ngx_alloc(size_t size, struct ngx_log_s *log);
void *ngx_calloc(size_t size, struct ngx_log_s *log);

struct ngx_pool_s *ngx_create_pool(size_t size, struct ngx_log_s *log);
void ngx_destroy_pool(struct ngx_pool_s *pool);
void ngx_reset_pool(struct ngx_pool_s *pool);

void *ngx_palloc(struct ngx_pool_s *pool, size_t size);
void *ngx_pnalloc(struct ngx_pool_s *pool, size_t size);
void *ngx_pcalloc(struct ngx_pool_s *pool, size_t size);
void *ngx_pmemalign(struct ngx_pool_s *pool, size_t size, size_t alignment);
ngx_int_t ngx_pfree(struct ngx_pool_s *pool, void *p);


ngx_pool_cleanup_t *ngx_pool_cleanup_add(struct ngx_pool_s *p, size_t size);
void ngx_pool_run_cleanup_file(struct ngx_pool_s *p, ngx_fd_t fd);
void ngx_pool_cleanup_file(void *data);
void ngx_pool_delete_file(void *data);


#endif /* _NGX_PALLOC_H_INCLUDED_ */
